/**
 * 
 */
package org.stars.daostars.core.parser;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.stars.daostars.core.SqlQuery;
import org.stars.daostars.sqlmapper.SqlMapper;

/**
 * 
 * 
 * @author Francesco Benincasa (908099)
 * 
 */
public abstract class FindWhiteSpace {

	/**
	 * pattern per più di uno spazio
	 */
	private final static String regSpace = "(\\s+)";

	/**
	 * Matcher compilato.
	 */
	private static Pattern pattern = Pattern.compile(getRegExMatcher(), Pattern.MULTILINE);

	/**
	 * @return pattern da cercare
	 */
	public static String getRegExMatcher() {
		return regSpace;
	}

	/**
	 * Data una definizione di dao, rimuove da tutte le query in essa contenuta
	 * gli spazi inutili.
	 * 
	 * @param definition
	 *            definizione del dao
	 * @return <code>true</code> se tutto va bene
	 * @throws Exception
	 *             in caso di errore
	 */
	public static boolean execute(SqlMapper definition) throws Exception {
		for (SqlQuery sqlQuery : definition.getQuerySet().values()) {
			String sql = sqlQuery.getPlainSql();
			String newSql= execute(sql);
			sqlQuery.setPlainSql(newSql);
		}

		return true;
	}
	
	/**
	 * Data una stringa in input, rimuove tutti i doppi spazi
	 * 
	 * @param input
	 *            stringa in input
	 * @return stringa in ouput senza spazi ripetuti
	 */
	public static String execute(String input) {
		return execute(input," ");
	}

	/**
	 * Data una stringa in input, rimuove tutti i doppi spazi
	 * 
	 * @param input
	 *            stringa in input
	 * @param replaceValue
	 * 			valore da mettere al posto degli spazi
	 * @return stringa in ouput senza spazi ripetuti
	 */
	public static String execute(String input, String replaceValue) {
		// dobbiamo per sicurezza rimuovere i caratteri prima e dopo
		input = input.trim();
		Matcher matcher = pattern.matcher(input);
		StringBuffer sb = new StringBuffer();

		while (matcher.find()) {
			matcher.appendReplacement(sb, replaceValue);
		}

		matcher.appendTail(sb);

		return sb.toString();
	}
}
